package com.example.day12;

import android.util.Log;

import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Scanner;

import static android.content.ContentValues.TAG;

public class HttpTools {
    HttpURLConnection connection ;

    /**
     *
     * get方式访问网络
     * @param paramsMap
     */
    public byte[] requestGet(HashMap<String, String> paramsMap,String URL) {
        String result=null;
        try {
            String baseUrl = URL;
            StringBuilder tempParams = new StringBuilder();
            int pos = 0;
            String requestUrl="";
            if(paramsMap!=null){
                for (String key : paramsMap.keySet()) {
                    if (pos > 0) {
                        tempParams.append("&");
                    }
                    tempParams.append(String.format("%s=%s", key, URLEncoder.encode(paramsMap.get(key),"utf-8")));
                    pos++;
                }
                requestUrl = baseUrl + tempParams.toString();
            }else{
                requestUrl=baseUrl;
            }
            // 新建一个URL对象
            URL url = new URL(requestUrl);//*****
            // 打开一个HttpURLConnection连接
            HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();//*****
            // 设置连接主机超时时间
            urlConn.setConnectTimeout(5 * 1000);
            //设置从主机读取数据超时
            urlConn.setReadTimeout(5 * 1000);
            // 设置是否使用缓存  默认是true
            urlConn.setUseCaches(true);
            // 设置为GET请求
            urlConn.setRequestMethod("GET");//*****
            //urlConn设置请求头信息
            //设置请求中的媒体类型信息。
            urlConn.setRequestProperty("Content-Type", "application/json");
            //设置客户端与服务连接类型
            urlConn.addRequestProperty("Connection", "Keep-Alive");
            // 开始连接
            urlConn.connect();//*****
            // 判断请求是否成功
            if (urlConn.getResponseCode() == 200) {
                // 获取返回的数据

                InputStream is = urlConn.getInputStream();
                ByteArrayOutputStream output = new ByteArrayOutputStream();
                byte[] buffer = new byte[1024];
                int len = -1;
                while ((len = is.read(buffer)) != -1) {
                    output.write(buffer, 0, len);
                }
                is.close();
                output.close();
                byte[] bytes = output.toByteArray();



                Log.e(TAG, "Get方式请求成功，result--->" + bytes.length);
                return bytes;
            } else {
                Log.e(TAG, "Get方式请求失败");
            }
            // 关闭连接
            urlConn.disconnect();
        } catch (Exception e) {
            Log.e(TAG, e.toString());
        }
        return null;
    }


    /**
     *  post方式访问网络
     * @param paramsMap
     */
    public byte[] requestPost(HashMap<String, String> paramsMap,String URL) {
        String result=null;
        try {
            String baseUrl = URL;
            //合成参数
            StringBuilder tempParams = new StringBuilder();
            int pos = 0;
            if(paramsMap!=null) {
                for (String key : paramsMap.keySet()) {
                    if (pos > 0) {
                        tempParams.append("&");
                    }
                    tempParams.append(String.format("%s=%s", key,  URLEncoder.encode(paramsMap.get(key),"utf-8")));
                    pos++;
                }
            }
            String params =tempParams.toString();
            // 请求的参数转换为byte数组
            byte[] postData = params.getBytes();
            // 新建一个URL对象
            URL url = new URL(baseUrl);///********
            // 打开一个HttpURLConnection连接
            HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
            // 设置连接超时时间
            urlConn.setConnectTimeout(5 * 1000);
            //设置从主机读取数据超时
            urlConn.setReadTimeout(5 * 1000);
            // Post请求必须设置允许输出 默认false
            urlConn.setDoOutput(true);
            //设置请求允许输入 默认是true
            urlConn.setDoInput(true);
            // Post请求不能使用缓存
            urlConn.setUseCaches(false);
            // 设置为Post请求
            urlConn.setRequestMethod("POST");//******
            //设置本次连接是否自动处理重定向
            urlConn.setInstanceFollowRedirects(true);
            // 配置请求Content-Type
            urlConn.setRequestProperty("Content-Type", "application/json");
            // 开始连接
            urlConn.connect();//********
            // 发送请求参数
            DataOutputStream dos = new DataOutputStream(urlConn.getOutputStream());//******
            dos.write(postData);
            dos.flush();
            dos.close();
            // 判断请求是否成功
            if (urlConn.getResponseCode() == 200) {
                // 获取返回的数据
//                result = streamToString(urlConn.getInputStream());

                InputStream is = urlConn.getInputStream();
                ByteArrayOutputStream output = new ByteArrayOutputStream();
                byte[] buffer = new byte[1024];
                int len = -1;
                while ((len = is.read(buffer)) != -1) {
                    output.write(buffer, 0, len);
                }
                is.close();
                output.close();
                byte[] data = output.toByteArray();

                return data;
            } else {
                Log.e(TAG, "Post方式请求失败");
            }
            // 关闭连接
            urlConn.disconnect();
        } catch (Exception e) {
            Log.e(TAG, e.toString());
        }
        return null;
    }

    public void downloadFile(String fileUrl){
        try {
            // 新建一个URL对象
            URL url = new URL(fileUrl);
            // 打开一个HttpURLConnection连接
            HttpURLConnection urlConn = (HttpURLConnection) url.openConnection();
            // 设置连接主机超时时间
            urlConn.setConnectTimeout(15 * 1000);
            //设置从主机读取数据超时
            urlConn.setReadTimeout(15 * 1000);
            // 设置是否使用缓存  默认是true
//            urlConn.setUseCaches(true);
//            // 设置为Post请求
            urlConn.setRequestMethod("GET");
//            //urlConn设置请求头信息
//            //设置请求中的媒体类型信息。
//            urlConn.setRequestProperty("Content-Type", "application/json");
//            //设置客户端与服务连接类型
//            urlConn.addRequestProperty("Connection", "Keep-Alive");
            // 开始连接
            urlConn.connect();
            // 判断请求是否成功
            if (urlConn.getResponseCode() == 200) {
                String filePath="";
//                File  descFile = new File(filePath);
//                FileOutputStream fos = new FileOutputStream(descFile);

                byte[] buffer = new byte[1024];
                int len;
                InputStream inputStream = urlConn.getInputStream();
                Log.e(TAG, "######Get方式请求成功，result--->" + inputStream.available());
                while ((len = inputStream.read(buffer)) != -1) {
                    // 写到本地
//                    fos.write(buffer, 0, len);
                }
            } else {
                Log.e(TAG, "文件下载失败");
            }
            // 关闭连接
            urlConn.disconnect();
        } catch (Exception e) {
            Log.e(TAG, e.toString());
        }
    }



    /**
     * 将输入流转换成字符串
     *
     * @param in
     * 从网络获取的输入流
     * @return
     */

    private String readInStream(InputStream in) {
        Scanner scanner = new Scanner(in).useDelimiter("\\A");
        return scanner.hasNext() ? scanner.next() : "";
    }


    /**
     * 将输入流转换成字符串
     *
     * @param is 从网络获取的输入流
     * @return
     */
    public String streamToString(InputStream is) {
        try {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024];
            int len = 0;
            while ((len = is.read(buffer)) != -1) {
                baos.write(buffer, 0, len);
            }
            baos.close();
            is.close();
            byte[] byteArray = baos.toByteArray();
            return new String(byteArray);
        } catch (Exception e) {
            Log.e(TAG, e.toString());
            return null;
        }
    }



}
